VT-d: fix iommu_domain_destroy
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 4 Jan 2010 09:06:36 +0000 (09:06 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 4 Jan 2010 09:06:36 +0000 (09:06 +0000)
Currently, g2m_ioport list and mapped_rmrrs always won't be released
in iommu_domain_destroy, because the function returns before those
code. It causes potential leak. This patch releases them, and thus
avoid the potential leak.

Signed-off-by: Weidong Han <Weidong.han@intel.com>
xen/drivers/passthrough/iommu.c

index 2ec6d5802e15753a99d4173c6db9dd323e8b3054..7558c8729fb82fb2a138f74f740bc83c6fecb241 100644 (file)
@@ -195,34 +195,25 @@ void iommu_domain_destroy(struct domain *d)
     if ( !iommu_enabled || !hd->platform_ops )
         return;
 
-    if ( !need_iommu(d)  )
-        return;
-
     if ( need_iommu(d) )
     {
         d->need_iommu = 0;
         hd->platform_ops->teardown(d);
-        return;
     }
 
-    if ( hd )
+    list_for_each_safe ( ioport_list, tmp, &hd->g2m_ioport_list )
     {
-        list_for_each_safe ( ioport_list, tmp, &hd->g2m_ioport_list )
-        {
-            ioport = list_entry(ioport_list, struct g2m_ioport, list);
-            list_del(&ioport->list);
-            xfree(ioport);
-        }
-
-        list_for_each_safe ( rmrr_list, tmp, &hd->mapped_rmrrs )
-        {
-            mrmrr = list_entry(rmrr_list, struct mapped_rmrr, list);
-            list_del(&mrmrr->list);
-            xfree(mrmrr);
-        }
+        ioport = list_entry(ioport_list, struct g2m_ioport, list);
+        list_del(&ioport->list);
+        xfree(ioport);
     }
 
-    return hd->platform_ops->teardown(d);
+    list_for_each_safe ( rmrr_list, tmp, &hd->mapped_rmrrs )
+    {
+        mrmrr = list_entry(rmrr_list, struct mapped_rmrr, list);
+        list_del(&mrmrr->list);
+        xfree(mrmrr);
+    }
 }
 
 int iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn)